package com.cykj.pos.service.Impl;

import com.cykj.common.utils.StringUtils;
import com.cykj.pos.controller.api.ResetQueueController;
import com.cykj.pos.domain.TransactionAmountEntity;
import com.cykj.pos.domain.ResetQueueEntity;
import com.cykj.pos.domain.TransactionStatisticsRecord;
import com.cykj.pos.mapper.ResetQueueMapper;
import com.cykj.pos.service.ResetQueueService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @author SunJinDuo
 * @date 2022/7/25
 */
@Service
public class ResetQueueServiceImpl implements ResetQueueService {

    private static final Logger logger = LoggerFactory.getLogger(ResetQueueServiceImpl.class);

    @Autowired
    private ResetQueueMapper resetQueueMapper;

    /**
     * @author: haoran
     * @date: 2022/7/26
     * 方法名称： 主方法
     */
    @Transactional
    @Override
    public int getList(ResetQueueEntity resetQueueEntity) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String startTime = df.format(System.currentTimeMillis());
//        logger.info("<<<<<--- 实现方法开始时间：" + startTime + " --->>>>> -");
        String dateTime = "";
        String montTime = "";
        String yearTime = "";
        SimpleDateFormat dateDf = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat monthDf = new SimpleDateFormat("yyyy-MM");
        SimpleDateFormat yearDf = new SimpleDateFormat("yyyy");
        if (resetQueueEntity.getDateTime() == null) {
            resetQueueEntity.setDateTime(new Date());
        }
        // 往重置表里插入数据
//        logger.info("<<<<<--- 往重置表里插入的数据为：" + resetQueueEntity + " --->>>>> -");
        resetQueueMapper.insert(resetQueueEntity);
        // 查询后缀名称
//        String suffix = resetQueueMapper.selectSuffix(resetQueueEntity.getMerchId());
        String tableName = "biz_transaction_amount";
//        if(StringUtils.isNotBlank(suffix)){
//            tableName=tableName+"_"+suffix;
//        }
//        logger.info("<<<<<--- merchId为：" + resetQueueEntity.getMerchId() + "时，该人员所属的机构流水表为：" + tableName + "。 --->>>>> -");
        if (resetQueueEntity.getDateTime() == null) {
            dateTime = dateDf.format(new Date());
            montTime = monthDf.format(new Date());
            yearTime = yearDf.format(new Date());
        } else {
            dateTime = dateDf.format(resetQueueEntity.getDateTime());
            montTime = monthDf.format(resetQueueEntity.getDateTime());
            yearTime = yearDf.format(resetQueueEntity.getDateTime());
        }
        // TODO 测试时间
//        dateTime = "2022-07-11";
        //获取重新统计变量
//        logger.info("<<<<<--- 调用获取重新统计变量方法 --->>>>> -");
        TransactionStatisticsRecord bl = this.processingData(resetQueueEntity.getMerchId(), tableName, dateTime);
        if(bl==null){
            return 0;
        }
//        logger.info("<<<<<--- 调用获取重新统计变量方法返回的值为：" + bl + " --->>>>> -");
        // 处理本级的日数据
//        logger.info("<<<<<--- 调用处理本级的日数据方法 --->>>>> -");
        proData(resetQueueEntity.getMerchId(), dateTime, bl);
        // 处理本级的月数据
//        logger.info("<<<<<--- 调用处理本级的月数据方法 --->>>>> -");
        proData(resetQueueEntity.getMerchId(), montTime, bl);
        // 处理本级的年数据
//        logger.info("<<<<<--- 调用处理本级的年数据方法 --->>>>> -");
        proData(resetQueueEntity.getMerchId(), yearTime, bl);
        //处理上级数据
//        logger.info("<<<<<--- 调用处理上级数据方法 --->>>>> -");
        proUpDate(resetQueueEntity.getMerchId(), dateTime, montTime, yearTime, bl);
        // 删除队列
//        logger.info("<<<<<--- 删除merchId为：" + resetQueueEntity.getMerchId() + "的队列数据 --->>>>> -");
        resetQueueMapper.delete(resetQueueEntity.getMerchId());
        String endTime = df.format(System.currentTimeMillis());
//        logger.info("<<<<<--- 实现方法结束时间：" + endTime + " --->>>>> -");
        return 1;
    }

    @Override
    public List<Long> selectMerchIds() {
        return resetQueueMapper.selectMerchIds();
    }


    /**
     * @author: haoran
     * @date: 2022/7/26
     * 方法名称： 计算重新统计变量
     */
    @Transactional
    public TransactionStatisticsRecord processingData(Long merchId, String tableName, String time) {
//        logger.info("<<<<<--- 计算重新统计变量方法传入的merchId为：" + merchId + " --->>>>> -");
//        logger.info("<<<<<--- 计算重新统计变量方法传入的tableName为：" + tableName + " --->>>>> -");
//        logger.info("<<<<<--- 计算重新统计变量方法传入的time为：" + time + " --->>>>> -");
        // 查询本级当天的本级流水总额
        TransactionStatisticsRecord tsr = resetQueueMapper.selectTransaction(merchId, time);
        if(tsr==null){
            return null;
        }
//        logger.info("<<<<<--- 查询merchId为：" + merchId + "本级当天的本级流水总额的数据为：" + tsr + " --->>>>> -");
        // 统计本级当天交易额变量
        TransactionStatisticsRecord btr = resetQueueMapper.selectMoney(merchId,tableName,time);
        if(btr==null){
            return null;
        }
//        logger.info("<<<<<--- 统计merchId为：" + merchId + "本级当天交易额变量的数据为：" + btr + " --->>>>> -");
        // 本级流水总额变量
        Double currentLevel = tsr.getCurrentLevel() ;
        if(btr!=null){
            currentLevel = tsr.getCurrentLevel() - btr.getCurrentLevel();
        }
        // 本级刷卡流水变量
        Double currentLevelPayCard = tsr.getCurrentLevelPayCard() ;
        if(btr!=null){
            currentLevelPayCard = tsr.getCurrentLevelPayCard() - btr.getCurrentLevelPayCard();
        }
        // 本级扫码流水变量
        Double currentLevelScanCode = tsr.getCurrentLevelScanCode()  ;
        if(btr!=null){
            currentLevelScanCode = tsr.getCurrentLevelScanCode() - btr.getCurrentLevelScanCode();
        }
        // 本级其他流水变量
        Double currentLevelOther = tsr.getCurrentLevelOther() ;
        if(btr!=null){
            currentLevelOther = tsr.getCurrentLevelOther() - btr.getCurrentLevelOther();
        }

        //统计下级当天交易额
        TransactionStatisticsRecord otr = resetQueueMapper.selectOrtherMone(merchId,tableName,time);
//        logger.info("<<<<<--- 统计merchId为：" + merchId + "下级当天交易额的数据为：" + otr + " --->>>>> -");
        // 下级流水总额变量
        Double lowerLevel = tsr.getLowerLevel() ;
        if(otr!=null){
            lowerLevel = tsr.getLowerLevel() - otr.getLowerLevel();
        }
        // 下级刷卡流水变量
        Double lowerLevelPayCard = tsr.getLowerLevelPayCard();
        if(otr!=null){
            lowerLevelPayCard = tsr.getLowerLevelPayCard() - otr.getLowerLevelPayCard();
        }
        // 下级扫码流水变量
        Double lowerLevelScanCode = tsr.getLowerLevelScanCode();
        if(otr!=null){
            lowerLevelScanCode = tsr.getLowerLevelScanCode() - otr.getLowerLevelScanCode();
        }
        // 本级其他流水变量
        Double lowerLevelOther = tsr.getLowerLevelOther();
        if(otr!=null){
            lowerLevelOther = tsr.getLowerLevelOther() - otr.getLowerLevelOther();
        }
        // 本级全部流水金额变量
        Double newAllMoney = tsr.getAllMoney();
        if(otr!=null){
            newAllMoney = tsr.getAllMoney() - otr.getLowerLevel();
        }
        if(btr!=null){
            newAllMoney=newAllMoney- btr.getCurrentLevel();
        }
        // 填充数据变量
        TransactionStatisticsRecord transactionStatisticsRecord = new TransactionStatisticsRecord();
        transactionStatisticsRecord.setMerchId(merchId);
        transactionStatisticsRecord.setCurrentLevel(currentLevel);
        transactionStatisticsRecord.setCurrentLevelPayCard(currentLevelPayCard);
        transactionStatisticsRecord.setCurrentLevelScanCode(currentLevelScanCode);
        transactionStatisticsRecord.setCurrentLevelOther(currentLevelOther);
        transactionStatisticsRecord.setLowerLevel(lowerLevel);
        transactionStatisticsRecord.setLowerLevelOther(lowerLevelOther);
        transactionStatisticsRecord.setLowerLevelPayCard(lowerLevelPayCard);
        transactionStatisticsRecord.setLowerLevelScanCode(lowerLevelScanCode);
        transactionStatisticsRecord.setAllMoney(newAllMoney);
        transactionStatisticsRecord.setDateTime(time);
//        logger.info("<<<<<--- 获取重新统计变量方法最终返回的数据为：" + transactionStatisticsRecord + " --->>>>> -");
        return transactionStatisticsRecord;
    }

    /**
     * 处理产生变化数据
     * @param merchId
     * @param time
     * @param bl
     */
    public void proData(Long merchId,String time,TransactionStatisticsRecord bl){
//        logger.info("<<<<<--- 处理产生变化数据方法接收到的merchId为：" + merchId + " --->>>>> -");
//        logger.info("<<<<<--- 处理产生变化数据方法接收到的time为：" + time + " --->>>>> -");
//        logger.info("<<<<<--- 处理产生变化数据方法接收到的实体TransactionStatisticsRecord为：" + bl + " --->>>>> -");
        bl.setMerchId(merchId);
        bl.setDateTime(time);
//        logger.info("<<<<<--- 处理产生变化数据最终的数据为：" + bl + " --->>>>> -");
        resetQueueMapper.updateCurrentLevelToday(bl);
    }

    /**
     * 处理上级数据
     * @param merchId
     * @param dateTime
     * @param montTime
     * @param yearTime
     * @param bl
     */
    private void proUpDate(Long merchId, String dateTime, String montTime, String yearTime, TransactionStatisticsRecord bl) {
//        logger.info("<<<<<--- 处理上级数据方法接收到的merchId为：" + merchId + " --->>>>> -");
//        logger.info("<<<<<--- 处理上级数据方法接收到的dateTime为：" + dateTime + " --->>>>> -");
//        logger.info("<<<<<--- 处理上级数据方法接收到的montTime为：" + montTime + " --->>>>> -");
//        logger.info("<<<<<--- 处理上级数据方法接收到的yearTime为：" + yearTime + " --->>>>> -");
//        logger.info("<<<<<--- 处理上级数据方法接收到的实体TransactionStatisticsRecord为：" + bl + " --->>>>> -");
        TransactionStatisticsRecord br = new TransactionStatisticsRecord();
        br.setMerchId(merchId);
        br.setAllMoney(bl.getAllMoney());
        br.setLowerLevel(bl.getCurrentLevel());
        br.setLowerLevelPayCard(bl.getCurrentLevelPayCard());
        br.setLowerLevelScanCode(bl.getCurrentLevelScanCode());
        br.setLowerLevelOther(bl.getCurrentLevelOther());
        List<Long> strList = resetQueueMapper.selectParentId(merchId);
//        logger.info("<<<<<--- 处理上级数据方法时，当merchId为：" + merchId + "时，查询回来的数据为：" + strList + " --->>>>> -");
//        logger.info("<<<<<--- 处理上级数据方法最终的数据为：" + br + " --->>>>> -");
        for (Long merch : strList) {
            br.setTimeType(0);
            // 处理上级的日数据
            proData(merch,dateTime,br);
            br.setTimeType(1);
            // 处理上级的月数据
            proData(merch,montTime,br);
            // 处理上级的年数据
            br.setTimeType(2);
            proData(merch,yearTime,br);
        }
    }

}
